#include "colorgradientpicker.h"
#include "ui_colorgradientpicker.h"

ColorGradientPicker::ColorGradientPicker(QWidget *parent) : QWidget(parent), ui(new Ui::ColorGradientPicker)
{
    ui->setupUi(this);

    // Establecemos la escena para el preview de color actual
    CurrentPreviewScene= new QGraphicsScene(0.0, 0.0, 1.0, 1.0, this);
    AlphaBrush= new QBrush(QColor(255, 255, 255, 255), Qt::SolidPattern);
    AlphaBrush->setTexture(QPixmap("../assets/textures/alpha.bmp"));
    ui->CurrentColorPreview->setScene(CurrentPreviewScene);
    CurrentPreviewScene->setBackgroundBrush(*AlphaBrush);
    CurrentPreviewScene->setForegroundBrush(QBrush(QColor(67, 134, 157, 255)));
    StartColor.r= 67; StartColor.g= 134; StartColor.b= 157; StartColor.a= 255;

    // Establecemos la escena para el preview de gradiente
    GradientPreviewScene= new QGraphicsScene(0.0, 0.0, 1.0, 1.0, this);
    ui->ColorPreview->setScene(GradientPreviewScene);
    GradientPreviewScene->setBackgroundBrush(*AlphaBrush);
    GradientPreviewScene->setForegroundBrush(QBrush(QColor(67, 134, 157, 128)));
    EndColor.r= 67; EndColor.g= 134; EndColor.b= 157; EndColor.a= 255;

    // Construimos la tabla de gradientes
    ui->ColorsTable->insertRow(ui->ColorsTable->rowCount());
    ui->ColorsTable->setRowHeight(ui->ColorsTable->rowCount()-1, 20);

    QTableWidgetItem *Color1= new QTableWidgetItem ("Inicio");
    Color1->setFlags(Color1->flags() ^ Qt::ItemIsEditable); // No editable
    ui->ColorsTable->setItem(ui->ColorsTable->rowCount()-1, 0, Color1);

    ui->ColorsTable->insertRow(ui->ColorsTable->rowCount());
    ui->ColorsTable->setRowHeight(ui->ColorsTable->rowCount()-1, 20);

    QTableWidgetItem *Color2= new QTableWidgetItem ("Final");
    Color2->setFlags(Color2->flags() ^ Qt::ItemIsEditable); // No editable
    ui->ColorsTable->setItem(ui->ColorsTable->rowCount()-1, 0, Color2);

    //ui->ColorsTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    ui->ColorsTable->horizontalHeader()->setResizeMode(QHeaderView::Stretch);

    UpdateGradient();
}

ColorGradientPicker::~ColorGradientPicker()
{
    delete ui;
}

// Cambia el canal rojo del preview de color actual
void ColorGradientPicker::on_RCScrollInput_valueChanged(int value)
{
    int R, G, B, A;

    R= value;
    G= ui->GCScrollInput->value();
    B= ui->BCScrollInput->value();
    A= ui->ACScrollInput->value();

    CurrentPreviewScene->setForegroundBrush(QBrush(QColor(R, G, B, A), Qt::SolidPattern));

    if (ui->ColorsTable->currentRow()== 0)
    {
        StartColor.r= R; StartColor.g= G; StartColor.b= B; StartColor.a= A;
        vec4 output;
        output.x= StartColor.r / 255.0;
        output.y= StartColor.g / 255.0;
        output.z= StartColor.b / 255.0;
        output.w= StartColor.a / 255.0;
        emit StartColorChanged(output);
    }
    else
    {
        EndColor.r= R; EndColor.g= G; EndColor.b= B; EndColor.a= A;
        vec4 output;
        output.x= EndColor.r / 255.0;
        output.y= EndColor.g / 255.0;
        output.z= EndColor.b / 255.0;
        output.w= EndColor.a / 255.0;
        emit EndColorChanged(output);
    }

    UpdateGradient();
}

// Cambia el canal verde del preview de color actual
void ColorGradientPicker::on_GCScrollInput_valueChanged(int value)
{
    int R, G, B, A;

    R= ui->RCScrollInput->value();
    G= value;
    B= ui->BCScrollInput->value();
    A= ui->ACScrollInput->value();

    CurrentPreviewScene->setForegroundBrush(QBrush(QColor(R, G, B, A), Qt::SolidPattern));

    if (ui->ColorsTable->currentRow()== 0)
    {
        StartColor.r= R; StartColor.g= G; StartColor.b= B; StartColor.a= A;
        vec4 output;
        output.x= StartColor.r / 255.0;
        output.y= StartColor.g / 255.0;
        output.z= StartColor.b / 255.0;
        output.w= StartColor.a / 255.0;
        emit StartColorChanged(output);
    }
    else
    {
        EndColor.r= R; EndColor.g= G; EndColor.b= B; EndColor.a= A;
        vec4 output;
        output.x= EndColor.r / 255.0;
        output.y= EndColor.g / 255.0;
        output.z= EndColor.b / 255.0;
        output.w= EndColor.a / 255.0;
        emit EndColorChanged(output);
    }

    UpdateGradient();
}

// Cambia el canal azul del preview de color actual
void ColorGradientPicker::on_BCScrollInput_valueChanged(int value)
{
    int R, G, B, A;

    R= ui->RCScrollInput->value();
    G= ui->GCScrollInput->value();
    B= value;
    A= ui->ACScrollInput->value();

    CurrentPreviewScene->setForegroundBrush(QBrush(QColor(R, G, B, A), Qt::SolidPattern));

    if (ui->ColorsTable->currentRow()== 0)
    {
        StartColor.r= R; StartColor.g= G; StartColor.b= B; StartColor.a= A;
        vec4 output;
        output.x= StartColor.r / 255.0;
        output.y= StartColor.g / 255.0;
        output.z= StartColor.b / 255.0;
        output.w= StartColor.a / 255.0;
        emit StartColorChanged(output);
    }
    else
    {
        EndColor.r= R; EndColor.g= G; EndColor.b= B; EndColor.a= A;
        vec4 output;
        output.x= EndColor.r / 255.0;
        output.y= EndColor.g / 255.0;
        output.z= EndColor.b / 255.0;
        output.w= EndColor.a / 255.0;
        emit EndColorChanged(output);
    }

    UpdateGradient();
}

// Cambia el canal alfa del preview de color actual
void ColorGradientPicker::on_ACScrollInput_valueChanged(int value)
{
    int R, G, B, A;

    R= ui->RCScrollInput->value();
    G= ui->GCScrollInput->value();
    B= ui->BCScrollInput->value();
    A= value;

    CurrentPreviewScene->setForegroundBrush(QBrush(QColor(R, G, B, A), Qt::SolidPattern));

    if (ui->ColorsTable->currentRow()== 0)
    {
        StartColor.r= R; StartColor.g= G; StartColor.b= B; StartColor.a= A;
        vec4 output;
        output.x= StartColor.r / 255.0;
        output.y= StartColor.g / 255.0;
        output.z= StartColor.b / 255.0;
        output.w= StartColor.a / 255.0;
        emit StartColorChanged(output);
    }
    else
    {
        EndColor.r= R; EndColor.g= G; EndColor.b= B; EndColor.a= A;
        vec4 output;
        output.x= EndColor.r / 255.0;
        output.y= EndColor.g / 255.0;
        output.z= EndColor.b / 255.0;
        output.w= EndColor.a / 255.0;
        emit EndColorChanged(output);
    }

    UpdateGradient();
}

// Esto permitira añadir un nuevo color al gradiente
void ColorGradientPicker::on_AddColorButton_clicked()
{
    QTableWidgetItem *Color= new QTableWidgetItem ("C" + QString("%1").arg(ui->ColorsTable->rowCount()));

    ui->ColorsTable->insertRow(ui->ColorsTable->rowCount());
    ui->ColorsTable->setRowHeight(ui->ColorsTable->rowCount()-1, 20);

    Color->setFlags(Color->flags() ^ Qt::ItemIsEditable); // No editable
    ui->ColorsTable->setItem(ui->ColorsTable->rowCount()-1, 0, Color);

    ui->ColorsTable->setCurrentCell(ui->ColorsTable->rowCount()-1, 0);

    // Y ahora vamos a añadir el nuevo color al vector de gradientes
    intercolor c;

    c.r= 64; c.g= 134; c.b= 157; c.a= 255;
    c.t= 1.0;

    SortTableAndColors();
    UpdateGradient();
}

// Esto permitira eliminar un color del gradiente
void ColorGradientPicker::on_RemoveColorButton_clicked()
{
    if (ui->ColorsTable->rowCount() > 0)
    {
        ui->ColorsTable->removeRow(ui->ColorsTable->currentRow());
    }
}

// Esto cargara la informacion del color escogido en la tabla
void ColorGradientPicker::on_ColorsTable_cellClicked(int row, int column)
{
    if (row== 0) // Inicio
        LoadColor(StartColor);
    else
        LoadColor(EndColor);

    UpdateGradient();
}

// Esto cargara la informacion de un color de 32 bits
void ColorGradientPicker::LoadColor(color32bit input)
{
    ui->RCScrollInput->setValue(input.r);
    ui->GCScrollInput->setValue(input.g);
    ui->BCScrollInput->setValue(input.b);
    ui->ACScrollInput->setValue(input.a);

    qDebug("%f %f %f %f", input.r, input.g, input.b, input.a);
}

// Esto ordena la tabla y el vector de colores de acuerdo al T
void ColorGradientPicker::SortTableAndColors()
{

}

// Esto actualiza el gradiente de color
void ColorGradientPicker::UpdateGradient()
{
    QLinearGradient G(QPointF(0,-203), QPointF(0,203));
    G.setColorAt(0, QColor(StartColor.r, StartColor.g, StartColor.b, StartColor.a));
    G.setColorAt(1, QColor(EndColor.r, EndColor.g, EndColor.b, EndColor.a));
    G.setSpread(QGradient::ReflectSpread);

    QBrush* Gradient= new QBrush (G);

    GradientPreviewScene->setForegroundBrush(*Gradient);
}

void ColorGradientPicker::SetStartColor(float* input)
{
    StartColor.r= input[0] * 255.0;
    StartColor.g= input[1] * 255.0;
    StartColor.b= input[2] * 255.0;
    StartColor.a= input[3] * 255.0;

    UpdateGradient();
}

void ColorGradientPicker::SetEndColor(float* input)
{
    EndColor.r= input[0] * 255.0;
    EndColor.g= input[1] * 255.0;
    EndColor.b= input[2] * 255.0;
    EndColor.a= input[3] * 255.0;

    UpdateGradient();
}

void ColorGradientPicker::Initialize(float *s, float *e)
{
    SColorBackup.x= StartColor.r= s[0] * 255.0;
    SColorBackup.y= StartColor.g= s[1] * 255.0;
    SColorBackup.z= StartColor.b= s[2] * 255.0;
    SColorBackup.w= StartColor.a= s[3] * 255.0;

    EColorBackup.x= EndColor.r= e[0] * 255.0;
    EColorBackup.y= EndColor.g= e[1] * 255.0;
    EColorBackup.z= EndColor.b= e[2] * 255.0;
    EColorBackup.w= EndColor.a= e[3] * 255.0;

    color32bit aux;
    aux.r= EndColor.r;
    aux.g= EndColor.g;
    aux.b= EndColor.b;
    aux.a= EndColor.a;
    qDebug("Aqui: %f, %f, %f, %f", aux.r, aux.g, aux.b, aux.a);
    LoadColor(aux);

    UpdateGradient();
}

// Guardamos el color! O mejor dicho, no hacemos nada...
void ColorGradientPicker::on_pushButton_clicked()
{
    this->close();
}

// Aqui retornamos el color inicial y cerramos
void ColorGradientPicker::on_pushButton_2_clicked()
{
    vec4 output;

    output.x= SColorBackup.x / 255.0;
    output.y= SColorBackup.y / 255.0;
    output.z= SColorBackup.z / 255.0;
    output.w= SColorBackup.w / 255.0;
    emit StartColorChanged(output);

    output.x= EColorBackup.x / 255.0;
    output.y= EColorBackup.y / 255.0;
    output.z= EColorBackup.z / 255.0;
    output.w= EColorBackup.w / 255.0;
    emit EndColorChanged(output);

    this->close();
}
